package com.rabbiter.hospital.service.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rabbiter.hospital.mapper.DrugMapper;
import com.rabbiter.hospital.pojo.Drug;
import com.rabbiter.hospital.service.DrugService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

@Service("DrugService")
public class DrugServiceImpl implements DrugService {
    @Autowired
    private DrugMapper drugMapper;

    /**
     * 分页模糊查询所有药物信息
     * @param pageNumber 当前页码
     * @param size       每页大小
     * @param query      搜索关键词
     * @return 包含总条数、总页数、当前页和查询到的记录的HashMap
     */
    @Override
    public HashMap<String, Object> findAllDrugs(int pageNumber, int size, String query) {
        // 创建分页对象，设定当前页和每页大小
        Page<Drug> page = new Page<>(pageNumber, size);
        // 创建查询构造器
        QueryWrapper<Drug> wrapper = new QueryWrapper<>();
        // 设置模糊查询条件，搜索药物名称中包含query的数据
        wrapper.like("dr_name", query);
        // 执行分页查询
        IPage<Drug> iPage = this.drugMapper.selectPage(page, wrapper);
        // 创建HashMap用于存储查询结果
        HashMap<String, Object> hashMap = new HashMap<>();
        // 存储总条数
        hashMap.put("total", iPage.getTotal());
        // 存储总页数
        hashMap.put("size", iPage.getPages());
        // 存储当前页
        hashMap.put("pageNumber", iPage.getCurrent());
        // 存储查询到的记录
        hashMap.put("drugs", iPage.getRecords());
        return hashMap;
    }

    /**
     * 根据id查找药物
     * @param drId 药物id
     * @return 查找到的药物信息
     */
    @Override
    public Drug findDrug(int drId) {
        // 根据id查询药物信息
        return this.drugMapper.selectById(drId);
    }

    /**
     * 根据id删除药物数量
     * @param drId       药物id
     * @param usedNumber 需要使用的数量
     * @return 如果药物库存足够则返回true，否则返回false
     */
    @Override
    public Boolean reduceDrugNumber(int drId, int usedNumber) {
        // 根据id获取药物信息
        Drug drug = this.drugMapper.selectById(drId);
        // 检查药物库存是否足够
        if (drug.getDrNumber() < usedNumber) return false;
        // 减少药物数量
        drug.setDrNumber(drug.getDrNumber() - usedNumber);
        // 更新数据库中的药物信息
        this.drugMapper.updateById(drug);
        return true;
    }

    /**
     * 增加药物信息
     * @param drug 待添加的药物对象
     * @return 如果添加成功则返回true，否则返回false
     */
    public Boolean addDrug(Drug drug) {
        // 查询所有药物信息
        List<Drug> drugs = this.drugMapper.selectList(null);
        // 检查药物id是否已存在
        for (Drug drug1 : drugs) {
            if (drug.getDrId() == drug1.getDrId()) {
                return false;
            }
        }
        // 插入新的药物信息
        this.drugMapper.insert(drug);
        return true;
    }

    /**
     * 删除药物信息
     * @param drId 药物id
     * @return 如果删除成功则返回true
     */
    @Override
    public Boolean deleteDrug(int drId) {
        // 根据id删除药物信息
        this.drugMapper.deleteById(drId);
        return true;
    }

    /**
     * 修改药物信息
     * @param drug 待修改的药物对象
     * @return 如果修改成功则返回true
     */
    @Override
    public Boolean modifyDrug(Drug drug) {
        // 更新药物信息，根据id匹配记录
        int i = this.drugMapper.updateById(drug);
        // 输出受影响的行数，用于调试
        System.out.println("影响行数：" + i);
        return true;
    }

}
